#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>

////////////////////////////////////
/// 滚动区域中的Item的 类型
////////////////////////////////////

enum ItemType
{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};


////////////////////////////////////
/// 整个滚动区域的实现
////////////////////////////////////

// 继承的类并不是QWidget,QScrollArea是滚动区
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    // 清空该区域里所有的Item
    void clear();

    // 添加一个Item 到 SessionFriendArea 区域内,
    // itemType 表示哪种 item，id跟着不同的itemType有不同的含义
    // SessionItemType: id--> sessionId
    // FriendItemType: id--> userId
    // ApplyType: id--> user
    void addItem(ItemType itemType,const QString& id,const QIcon& avatar,const QString& name, const QString& text);

    // 选中某个指定的Item, 存在Item内设置的是鼠标选中，此处是通过下标选中
    void clickItem(int index);

    explicit SessionFriendArea(QWidget *parent = nullptr);
    // 需要搭配一个特定的widget
    // 后续往 container内部的layout中添加元素，就能触发QScorllArea滚动效果

    QWidget* container;
signals:
};



////////////////////////////////////
/// 滚动区域中的Item的实现
////////////////////////////////////
class SessionFriendItem : public QWidget
{
    Q_OBJECT //自定义的类，如果要让他支持信号槽这样的机制必须定义Q_OBJECT

public:

    // 继承自QWidget的子类，必须重写paintEvent该函数，以QWidget设置的样式才能在子类中生效
    void paintEvent(QPaintEvent* event) override;

    // 重写该鼠标点击函数，使得当鼠标点击 Item时 能够变色
    void mousePressEvent(QMouseEvent* event) override;
    void enterEvent(QEnterEvent* event) override;
    void leaveEvent(QEvent* event) override;
    void select();

    // active 函数期望实现Item 被点击后的业务逻辑
    virtual void active();


    // owner：SessionFriendItem被哪个Widget持有
    // owner：对应着 SessionFriendArea对象的指针
    // 如果直接把SessionFriendItem添加到SessionFriendArea里的布局管理器中
    // 此时可以直接使用SessionFriendItem的parent相关操作，就能找到 SessionFriendArea  此时不需要额外owner
    // 但是实际情况上，需要把 SessionFriendItem 添加到 SessionFriendArea 成员中 container的layout里
    // 此时 通过SessionFriendItem的parent相关操作，得到的是container这个指针对象，不容易得到 SessionFriendArea的指针，后续又使用它，
    // 为了更方便使用 SessionFriendArea相关的操作，所以使用owner 记录SessionFriendArea的指针
    SessionFriendItem(QWidget* owner,const QIcon& avatar,const QString& name,const QString& text);
private:

    // owner 指向了上述的 SessionFriendArea
    QWidget* owner;
    // 这个变量用来表示当前item 是否是选中状态
    bool selected = false;
protected:
    // 需要让该变量能够在子类中被访问到
    // 消息预览
    QLabel* messageLabel;
};

///////////////////////////////
///  基于SessionFriendItem这个类，创建一些子类出来
///  分别是会话子类，好友子类，好友申请子类，
///  往页面添加的并非是SesstionFriendItem这个类，
///  而是派生出来的几种子类
////////////////////////////////


///////////////////////////////
///  会话Item的实现
////////////////////////////////

class SessionItem : public SessionFriendItem
{
    Q_OBJECT
public:
    SessionItem(QWidget* owner,const QString& chatSessionID,const QIcon& avatar,
                const QString& name,const QString& lastMessage);
    void active() override;

private:
    // 当前会话ID
    QString chatSessionId;


};


///////////////////////////////
///  好友 Item的实现
////////////////////////////////
class FriendItem : public SessionFriendItem
{
    Q_OBJECT
public:
    //description 个性签名
    FriendItem(QWidget* owner,const QString& userId,const QIcon& avatar,
                const QString& name,const QString& description);
     void active() override;
private:
    //  好友用户Id
    QString userId;
};


///////////////////////////////
///  好友申请 Item的实现
////////////////////////////////


class ApplyItem : public SessionFriendItem
{
    Q_OBJECT
public:
    // 此处不需要显示一个附加的文本了，比上面的两个Item的构造函数，少了一个参数
    ApplyItem(QWidget* owner,const QString& userId,const QIcon& avatar,
               const QString& name);
     void active() override;
private:
    //  申请人的Id
    QString userId;
};


#endif // SESSIONFRIENDAREA_H
